package br.com.dallasmotopecas.comum.agenda.controller;

import java.sql.Connection;
import java.util.List;

import javax.faces.context.ExternalContext;

import br.com.dallasmotopecas.comum.agenda.model.AgendaModel;
import br.com.dallasmotopecas.comum.agenda.vo.AgendaVo;
import br.com.dallasmotopecas.util.controller.AbstractController;
import br.com.dallasmotopecas.util.exception.AgendaCadastradaException;
import br.com.dallasmotopecas.util.exception.AlterarObjetoException;
import br.com.dallasmotopecas.util.exception.CampoObrigatorioException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.ConsultarObjetoException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;

public class AgendaController extends AbstractController
{
	public AgendaController(Connection connection) throws ConexaoException
	{
		super(connection);
	}
	
	public AgendaController(ExternalContext externalContext) throws ClasseNaoEncontradaException, ConexaoException
	{
		super(externalContext);
	}
	
	private void campoObrigatorio(final AgendaVo agendaVo) throws CampoObrigatorioException
	{
		if (agendaVo.getUsuarioVo().getId() == 0)
			throw new CampoObrigatorioException("Por Favor Informe o Usuário da Agenda");
		
		if (agendaVo.getDataAgenda() == null)
			throw new CampoObrigatorioException("Por Favor Informe a Data da Agenda");
		
		if (agendaVo.getFlgEncerrada() == null || agendaVo.getFlgEncerrada().isEmpty())
			throw new CampoObrigatorioException("Por Favor Informe o Encerramento da Agenda");
		
		if (agendaVo.getFlgReagendada() == null || agendaVo.getFlgReagendada().isEmpty())
			throw new CampoObrigatorioException("Por Favor Informe o Reagendamento da Agenda");
	}
	
	public void alterarAgenda(final AgendaVo agendaVo) throws CampoObrigatorioException, AlterarObjetoException
	{
		AgendaModel agendaModel = null;
		try
		{
			if (agendaVo != null)
			{
				campoObrigatorio(agendaVo);
				agendaModel = new AgendaModel(getConnection());
				agendaModel.alterarAgenda(agendaVo);
			}
		}
		catch (AlterarObjetoException e)
		{
			throw e;
		}
		finally
		{
			agendaModel = null;
		}
	}
	
	public void inserirAgenda(final AgendaVo agendaVo) throws CampoObrigatorioException, InserirObjetoException, AgendaCadastradaException, ConsultarObjetoException
	{
		AgendaModel agendaModel = null;
		AgendaVo agendaConsulta = null;
		try
		{
			if (agendaVo != null)
			{
				campoObrigatorio(agendaVo);
				
				/*if (ManipulacaoData.getDiaSemana(agendaVo.getDataAgenda()) == 7)
					throw new AgendaFinalSemanaException("N�o se pode Cadastrar Agenda Para o S�bado.");
				
				if (ManipulacaoData.getDiaSemana(agendaVo.getDataAgenda()) == 1)
					throw new AgendaFinalSemanaException("N�o se pode Cadastrar Agenda Para o Domingo.");*/
				
				agendaConsulta = new AgendaVo();
				
				agendaConsulta.setUsuarioVo(agendaVo.getUsuarioVo());
				agendaConsulta.setDataAgenda(agendaVo.getDataAgenda());
				
				consultarAgenda(agendaConsulta);
				
				if (agendaConsulta.getId() > 0 && agendaConsulta.getId() != agendaVo.getId())
					throw new AgendaCadastradaException("Já Existe Cadastrado um Agendamento para Este Dia");
				
				agendaModel = new AgendaModel(getConnection());
				agendaModel.inserirAgenda(agendaVo);
			}
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		catch (ConsultarObjetoException e)
		{
			throw e;
		}
		finally
		{
			agendaModel = null;
			agendaConsulta = null;
		}
	}
	
	public void inserirAgendaPorAtendimento(final AgendaVo agendaVo) throws CampoObrigatorioException, InserirObjetoException
	{
		AgendaModel agendaModel = null;
		try
		{
			if (agendaVo != null)
			{
				campoObrigatorio(agendaVo);
				
				/*if (ManipulacaoData.getDiaSemana(agendaVo.getDataAgenda()) == 7)
					throw new AgendaFinalSemanaException("N�o se pode Atender Agenda no S�bado.");
				
				if (ManipulacaoData.getDiaSemana(agendaVo.getDataAgenda()) == 1)
					throw new AgendaFinalSemanaException("N�o se pode Atender Agenda no Domingo.");*/
				
				agendaModel = new AgendaModel(getConnection());
				agendaModel.inserirAgenda(agendaVo);
			}
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			agendaModel = null;
		}
	}
	
	public void consultarAgenda(final AgendaVo agendaVo) throws ConsultarObjetoException
	{
		AgendaModel agendaModel = null;
		try
		{
			if (agendaVo != null)
			{
				agendaModel = new AgendaModel(getConnection());
				agendaModel.consultarAgenda(agendaVo);
			}
		}
		catch (ConsultarObjetoException e)
		{
			throw e;
		}
		finally
		{
			agendaModel = null;
		}
	}
	
	public void listarAgenda(final List<AgendaVo> listaAgenda, final AgendaVo agendaVo) throws ListarObjetoException
	{
		AgendaModel agendaModel = null;
		try
		{
			if (listaAgenda != null && agendaVo != null)
			{	
				listaAgenda.clear();
				
				agendaModel = new AgendaModel(getConnection());
				listaAgenda.addAll(agendaModel.getListaAgenda(agendaVo));
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			agendaModel = null;
		}
	}
}
